package com.ql.util;

import java.util.*;

/**
 * Created by Administrator on 2016/12/31.
 */
public class MapDemo {
    public static void main(String[] args) {
            /*
             * HashMap继承自Map接口，是基于哈希表的双列集合，是不同步的，键是唯一的，键和值可以为空，不保证顺序
             */
            HashMap<String,Integer> hm = new HashMap<String,Integer>();
            /*
             * put方法会键值对添加到HashMap中，并且返回此键的原值，如果没有原值，返回null
             * 添加同一个键的对应关系时，新值会将原值覆盖，
             */
            System.out.println(hm.put("a", 32));
            System.out.println(hm.put("a", 33));
            /*
             * remove方法会删除指定的键的对应关系，并返回对应的值，如果没有该对应关系，返回null
             */
            System.out.println(hm.remove("z"));
            hm.put("z", 100);
            System.out.println(hm.remove("z"));
            /*
             * containsKey和containsValue分别用于判断HashMap中是否存在指定的键和值，
             * 如果存在返回true，不存在返回false，反过来可以通过返回值来判断是否存在
             * 键和值
             */
            System.out.println(hm.containsKey("a"));
            System.out.println(hm.containsKey("b"));
            System.out.println(hm.containsValue(33));
            System.out.println(hm.containsValue(24));
            /*
             * isEmpty用来判断HashMap是否为空，如果为空返回true，不为空返回false
             */
            System.out.println(hm.isEmpty());
            /*
             * get方法可以通过指定的键获取其对应的值，如果不存在返回null
             */
            System.out.println(hm.get("a"));
            System.out.println(hm.get("x"));
            /*
             * values方法可以获得HashMap中所有的值，因为Map不要求值是唯一的，所以返回Collection
             * 对Collection进行遍历，可以获取每一个值
             */
            hm.put("s", 22);
            hm.put("v", 23);
            hm.put("j", 24);
            Collection<Integer> values = hm.values();
            Iterator it = values.iterator();
            while(it.hasNext()){
                System.out.println(it.next());
            }
            /*
             * keySet方法返回HashMap中所有的key,因为key是唯一的，所以以map的形式返回
             * 然后使用迭代器遍历，可以获取到所有的key和value
             */
            Set<String> keySet = hm.keySet();
            Iterator it1 = keySet.iterator();
            while(it1.hasNext()){
                String key = (String) it1.next();
                Integer value = hm.get(key);
                System.out.println(key+"::"+value);
            }
            /*
             * entrySet方法返回HashMap中所有的键值对，同样以Set形式，遍历拿到每个
             * 键值对Map.Entry<String, Integer>，然后通过Map.Entry的getKey和getValue
             * 方法可以获取到所有的key和value
             */
            Set<Map.Entry<String, Integer>> entrySet = hm.entrySet();
            Iterator it2 = entrySet.iterator();
            while(it2.hasNext()){
                Map.Entry<String, Integer> keyToValue = (Map.Entry<String, Integer>)it2.next();
                String key = keyToValue.getKey();
                Integer value = keyToValue.getValue();
                System.out.println(key+"::"+value);
            }

            /*
             * Hashtable继承自Dictionary类，双列集合，同步的，键是唯一的，
             * 键和值都不可以为null（与HashMap最重要的区别），不保证顺序,HashTable
             * 保证键唯一的原理:先判断哈希值，如果相等，在判断equals如果为true则不存
             * 如果哈希值不等，或者equals返回false则存入该键值对。
             */
            Hashtable ht = new Hashtable();
            /*
             * 如果以String为键，因为String已经重写了hashCode和equals方法，所以下面存入的
             * 2会将1覆盖掉。但是自定义的Person类，如果不重写hashCode和equals方法，那么两个
             * zhangsan都会被存入到HashTable中。
             */
            ht.put(new Person("zhangsan",20),2);
            ht.put(new Person("zhangsan",20),3);
            ht.put("a", 1);
            ht.put("a", 2);
            System.out.println(ht);

            /*
             * TreeMap是双列集合，是不同步的，键是唯一的，键值都不允许为null，是有序的，
             * 与TreeSet类似，都是通过比较器或者元素自身的比较来决定元素的顺序。
             */
            TreeMap tm = new TreeMap(new ComparatorImpl());
            tm.put(new Person("zhangsan",20), 1);
            tm.put(new Person("zhangsan",22), 2);
            tm.put(new Person("lisi",22), 1);
            tm.put(new Person("zhaowu",24), 1);
            tm.put(new Person("qianliu",26), 1);
            //tm.put(null, 3);
            //tm.put(new Person("wangcai",22), null);
            //tm.put(null, null);

            System.out.println(tm.size());

            Set<Person> keySet1 = tm.keySet();
            Iterator it3 = keySet1.iterator();
            while(it3.hasNext()){
                Person p = (Person) it3.next();
                Integer value = (Integer) tm.get(p);
                System.out.println(p.getName()+"::"+p.getAge()+"：："+value);
            }



        }

    }

    class ComparatorImpl implements Comparator{
        //自定义比较器，实现Comparator借口，重写compare方法。
        public int compare(Object o1, Object o2) {
            Person p1 = (Person)o1;
            Person p2 = (Person)o2;
            int temp = p1.getName().compareTo(p2.getName());
            //按照名字排序，如果名字相同，就以年龄排序
            return (temp==0)?p1.getAge()-p2.getAge():temp;
        }
}
